// using UnityEngine;
// using GGameFramework.Core.FSM;
// using GGameFramework.Core.Variable;
//
// namespace GGameFramework.Examples.FSM
// {
//     /// <summary>
//     /// 玩家控制器 - 展示状态机系统的完整用法
//     /// </summary>
//     public class PlayerController : MonoBehaviour
//     {
//         [Header("移动参数")]
//         [SerializeField] private float m_MoveSpeed = 5f;
//         [SerializeField] private float m_JumpForce = 10f;
//         [SerializeField] private float m_Gravity = -20f;
//         
//         [Header("战斗参数")]
//         [SerializeField] private float m_AttackRange = 2f;
//         [SerializeField] private float m_AttackDamage = 25f;
//         [SerializeField] private float m_AttackCooldown = 1f;
//         
//         [Header("状态机调试")]
//         [SerializeField] private bool m_ShowDebugInfo = true;
//         
//         // 状态机相关
//         private IFsm<PlayerController> m_Fsm;
//         private FsmDebugger<PlayerController> m_Debugger;
//         
//         // 组件引用
//         private CharacterController m_CharacterController;
//         private Animator m_Animator;
//         private AudioSource m_AudioSource;
//         
//         // 状态机共享数据
//         private const string KEY_MOVE_INPUT = "MoveInput";
//         private const string KEY_JUMP_INPUT = "JumpInput";
//         private const string KEY_ATTACK_INPUT = "AttackInput";
//         private const string KEY_IS_GROUNDED = "IsGrounded";
//         private const string KEY_ATTACK_COOLDOWN = "AttackCooldown";
//         private const string KEY_LAST_ATTACK_TIME = "LastAttackTime";
//         private const string KEY_TARGET_ENEMY = "TargetEnemy";
//         private const string KEY_HEALTH = "Health";
//         private const string KEY_MAX_HEALTH = "MaxHealth";
//         
//         // 私有变量
//         private Vector3 m_MoveDirection;
//         private float m_VerticalVelocity;
//         private float m_LastAttackTime;
//         private int m_CurrentHealth;
//         private int m_MaxHealth = 100;
//         
//         private void Awake()
//         {
//             m_CharacterController = GetComponent<CharacterController>();
//             m_Animator = GetComponent<Animator>();
//             m_AudioSource = GetComponent<AudioSource>();
//             
//             if (m_CharacterController == null)
//             {
//                 m_CharacterController = gameObject.AddComponent<CharacterController>();
//             }
//             
//             m_CurrentHealth = m_MaxHealth;
//         }
//         
//         private void Start()
//         {
//             InitializeFSM();
//             SetupFSMData();
//             StartFSM();
//         }
//         
//         private void Update()
//         {
//             HandleInput();
//             UpdateFSM();
//         }
//         
//         private void OnGUI()
//         {
//             if (m_ShowDebugInfo)
//             {
//                 DrawDebugInfo();
//             }
//         }
//         
//         /// <summary>
//         /// 初始化状态机
//         /// </summary>
//         private void InitializeFSM()
//         {
//             // 创建状态机
//             m_Fsm = FsmManager.Instance.CreateFsm<PlayerController>("PlayerFSM", this);
//             
//             // 添加所有状态
//             m_Fsm.AddState<PlayerIdleState>();
//             m_Fsm.AddState<PlayerMoveState>();
//             m_Fsm.AddState<PlayerJumpState>();
//             m_Fsm.AddState<PlayerFallState>();
//             m_Fsm.AddState<PlayerAttackState>();
//             m_Fsm.AddState<PlayerHurtState>();
//             m_Fsm.AddState<PlayerDeathState>();
//             
//             // 创建调试器
//             m_Debugger = new FsmDebugger<PlayerController>(m_Fsm);
//             
//             // 订阅状态转换事件
//             m_Fsm.OnStateChanged += OnStateChanged;
//             
//             Debug.Log("玩家状态机初始化完成");
//         }
//         
//         /// <summary>
//         /// 设置状态机初始数据
//         /// </summary>
//         private void SetupFSMData()
//         {
//             m_Fsm.SetData(KEY_HEALTH, new IntVariable(m_CurrentHealth));
//             m_Fsm.SetData(KEY_MAX_HEALTH, new IntVariable(m_MaxHealth));
//             m_Fsm.SetData(KEY_ATTACK_COOLDOWN, new FloatVariable(m_AttackCooldown));
//             m_Fsm.SetData(KEY_LAST_ATTACK_TIME, new FloatVariable(0f));
//             m_Fsm.SetData(KEY_IS_GROUNDED, new BoolVariable(true));
//         }
//         
//         /// <summary>
//         /// 启动状态机
//         /// </summary>
//         private void StartFSM()
//         {
//             m_Fsm.Start<PlayerIdleState>();
//             Debug.Log("玩家状态机启动，当前状态：空闲");
//         }
//         
//         /// <summary>
//         /// 处理输入
//         /// </summary>
//         private void HandleInput()
//         {
//             // 移动输入
//             float horizontal = Input.GetAxis("Horizontal");
//             float vertical = Input.GetAxis("Vertical");
//             m_MoveDirection = new Vector3(horizontal, 0, vertical).normalized;
//             m_Fsm.SetData(KEY_MOVE_INPUT, new Vector3Variable(m_MoveDirection));
//             
//             // 跳跃输入
//             bool jumpInput = Input.GetKeyDown(KeyCode.Space);
//             m_Fsm.SetData(KEY_JUMP_INPUT, new BoolVariable(jumpInput));
//             
//             // 攻击输入
//             bool attackInput = Input.GetMouseButtonDown(0);
//             m_Fsm.SetData(KEY_ATTACK_INPUT, new BoolVariable(attackInput));
//             
//             // 更新地面检测
//             bool isGrounded = m_CharacterController.isGrounded;
//             m_Fsm.SetData(KEY_IS_GROUNDED, new BoolVariable(isGrounded));
//         }
//         
//         /// <summary>
//         /// 更新状态机
//         /// </summary>
//         private void UpdateFSM()
//         {
//             // 状态机更新由FsmManager自动处理
//             // 这里可以添加额外的逻辑
//         }
//         
//         /// <summary>
//         /// 状态转换事件处理
//         /// </summary>
//         private void OnStateChanged(IFsm<PlayerController> fsm, FsmState<PlayerController> fromState, FsmState<PlayerController> toState)
//         {
//             string fromStateName = fromState?.GetStateName() ?? "None";
//             string toStateName = toState?.GetStateName() ?? "None";
//             
//             Debug.Log($"状态转换: {fromStateName} -> {toStateName}");
//             
//             // 更新动画状态
//             if (m_Animator != null)
//             {
//                 m_Animator.SetTrigger("StateChanged");
//                 m_Animator.SetInteger("StateHash", toStateName.GetHashCode());
//             }
//         }
//         
//         /// <summary>
//         /// 绘制调试信息
//         /// </summary>
//         private void DrawDebugInfo()
//         {
//             if (!m_ShowDebugInfo || m_Fsm == null) return;
//             
//             GUILayout.BeginArea(new Rect(10, 10, 300, 400));
//             GUILayout.Label("=== 玩家状态机调试信息 ===", GUI.skin.box);
//             
//             // 当前状态信息
//             GUILayout.Label($"当前状态: {m_Fsm.CurrentState?.GetStateName() ?? "None"}");
//             GUILayout.Label($"状态持续时间: {m_Fsm.CurrentStateTime:F2}s");
//             GUILayout.Label($"状态机运行中: {m_Fsm.IsRunning}");
//             
//             // 玩家属性
//             GUILayout.Label($"生命值: {m_CurrentHealth}/{m_MaxHealth}");
//             GUILayout.Label($"地面状态: {m_Fsm.GetData<BoolVariable>(KEY_IS_GROUNDED)?.Value}");
//             
//             // 输入状态
//             Vector3 moveInput = m_Fsm.GetData<Vector3Variable>(KEY_MOVE_INPUT)?.Value ?? Vector3.zero;
//             GUILayout.Label($"移动输入: {moveInput}");
//             
//             // 状态历史
//             if (m_Debugger != null)
//             {
//                 var history = m_Debugger.GetStateHistory();
//                 GUILayout.Label($"状态历史数量: {history.Count}");
//                 
//                 if (GUILayout.Button("查看详细历史"))
//                 {
//                     ShowStateHistory(history);
//                 }
//             }
//             
//             // 状态机数据
//             if (GUILayout.Button("查看状态机数据"))
//             {
//                 ShowFSMData();
//             }
//             
//             GUILayout.EndArea();
//         }
//         
//         /// <summary>
//         /// 显示状态历史
//         /// </summary>
//         private void ShowStateHistory(System.Collections.Generic.List<FsmDebugger<PlayerController>.FsmDebugInfo> history)
//         {
//             string historyText = "状态历史:\n";
//             for (int i = history.Count - 1; i >= 0; i--)
//             {
//                 var info = history[i];
//                 historyText += $"[{info.Timestamp:F2}s] {info.StateName} (持续{info.StateTime:F2}s)\n";
//             }
//             
//             Debug.Log(historyText);
//         }
//         
//         /// <summary>
//         /// 显示状态机数据
//         /// </summary>
//         private void ShowFSMData()
//         {
//             string dataText = "状态机数据:\n";
//             dataText += $"生命值: {m_Fsm.GetData<IntVariable>(KEY_HEALTH)?.Value}\n";
//             dataText += $"最大生命值: {m_Fsm.GetData<IntVariable>(KEY_MAX_HEALTH)?.Value}\n";
//             dataText += $"攻击冷却: {m_Fsm.GetData<FloatVariable>(KEY_ATTACK_COOLDOWN)?.Value}\n";
//             dataText += $"最后攻击时间: {m_Fsm.GetData<FloatVariable>(KEY_LAST_ATTACK_TIME)?.Value}\n";
//             dataText += $"地面状态: {m_Fsm.GetData<BoolVariable>(KEY_IS_GROUNDED)?.Value}\n";
//             
//             Debug.Log(dataText);
//         }
//         
//         /// <summary>
//         /// 受到伤害
//         /// </summary>
//         public void TakeDamage(int damage)
//         {
//             m_CurrentHealth = Mathf.Max(0, m_CurrentHealth - damage);
//             m_Fsm.SetData(KEY_HEALTH, new IntVariable(m_CurrentHealth));
//             
//             if (m_CurrentHealth <= 0)
//             {
//                 // 切换到死亡状态
//                 if (m_Fsm.CurrentState is PlayerDeathState == false)
//                 {
//                     m_Fsm.ChangeState<PlayerDeathState>();
//                 }
//             }
//             else
//             {
//                 // 切换到受伤状态
//                 if (m_Fsm.CurrentState is PlayerHurtState == false)
//                 {
//                     m_Fsm.ChangeState<PlayerHurtState>();
//                 }
//             }
//         }
//         
//         /// <summary>
//         /// 治疗
//         /// </summary>
//         public void Heal(int amount)
//         {
//             m_CurrentHealth = Mathf.Min(m_MaxHealth, m_CurrentHealth + amount);
//             m_Fsm.SetData(KEY_HEALTH, new IntVariable(m_CurrentHealth));
//         }
//         
//         /// <summary>
//         /// 播放音效
//         /// </summary>
//         public void PlaySound(AudioClip clip)
//         {
//             if (m_AudioSource != null && clip != null)
//             {
//                 m_AudioSource.PlayOneShot(clip);
//             }
//         }
//         
//         /// <summary>
//         /// 获取移动速度
//         /// </summary>
//         public float GetMoveSpeed() => m_MoveSpeed;
//         
//         /// <summary>
//         /// 获取跳跃力度
//         /// </summary>
//         public float GetJumpForce() => m_JumpForce;
//         
//         /// <summary>
//         /// 获取重力
//         /// </summary>
//         public float GetGravity() => m_Gravity;
//         
//         /// <summary>
//         /// 获取角色控制器
//         /// </summary>
//         public CharacterController GetCharacterController() => m_CharacterController;
//         
//         /// <summary>
//         /// 获取动画器
//         /// </summary>
//         public Animator GetAnimator() => m_Animator;
//         
//         /// <summary>
//         /// 获取当前生命值
//         /// </summary>
//         public int GetCurrentHealth() => m_CurrentHealth;
//         
//         /// <summary>
//         /// 获取最大生命值
//         /// </summary>
//         public int GetMaxHealth() => m_MaxHealth;
//         
//         /// <summary>
//         /// 检查是否可以攻击
//         /// </summary>
//         public bool CanAttack()
//         {
//             float lastAttackTime = m_Fsm.GetData<FloatVariable>(KEY_LAST_ATTACK_TIME)?.Value ?? 0f;
//             return Time.time - lastAttackTime >= m_AttackCooldown;
//         }
//         
//         /// <summary>
//         /// 设置最后攻击时间
//         /// </summary>
//         public void SetLastAttackTime()
//         {
//             m_LastAttackTime = Time.time;
//             m_Fsm.SetData(KEY_LAST_ATTACK_TIME, new FloatVariable(m_LastAttackTime));
//         }
//         
//         private void OnDestroy()
//         {
//             // 清理状态机
//             if (m_Fsm != null)
//             {
//                 m_Fsm.OnStateChanged -= OnStateChanged;
//                 FsmManager.Instance.DestroyFsm<PlayerController>();
//             }
//         }
//     }
// }

